package sessionbeans;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import xml.XMLParser;
import dto.CentroDistribucionDTO;
import dto.xml.XMLItemPedidoDTO;
import dto.xml.XMLPedidoDTO;
import dto.xml.XMLSolDistDTO;
import entitybeans.Articulo;
import entitybeans.CentroDistribucion;
import entitybeans.ItemPedido;
import entitybeans.Pedido;
import entitybeans.SolicitudDistribucion;

@Stateless
public class SOLDISsessionBean implements SOLDIS {
	
	@PersistenceContext
	private EntityManager em;
	
	@Override
	public List<CentroDistribucionDTO> getCentros() {
		Query q= em.createQuery("SELECT cd FROM CentroDistribucion cd");
		List<CentroDistribucion> centros= q.getResultList();
		List<CentroDistribucionDTO> replicas= new ArrayList<CentroDistribucionDTO>();
		for(CentroDistribucion cd : centros){
			replicas.add(cd.getDTO());
		}
		return replicas;
	}

	@Override
	public void generarSOLDIS(String ref) {
		Query q= em.createQuery("SELECT cd FROM CentroDistribucion cd WHERE cd.ref = ?").setParameter(1, Integer.parseInt(ref));
		CentroDistribucion cd= (CentroDistribucion)q.getSingleResult();

		SolicitudDistribucion solicitud= new SolicitudDistribucion(null, cd);

		Query q1= em.createQuery("SELECT p FROM Pedido p WHERE p.pendienteDeDistribucion= ?1 and p.centroDistribucion= ?2").setParameter(1, false).setParameter(2, cd);
		List<Pedido> pedidos= (List<Pedido>)q1.getResultList();

		List<Articulo> articulos= new ArrayList<Articulo>();
		List<XMLPedidoDTO> pedidosDTO = new ArrayList<XMLPedidoDTO>();
		
		if (!pedidos.isEmpty() && pedidos.get(0)!=null){
			em.persist(solicitud);

			for(Pedido p : pedidos){
				if(p != null){	
					List<ItemPedido> items= p.getItemsPedidos();
					List<XMLItemPedidoDTO> itemsPedidoDTO= new ArrayList<XMLItemPedidoDTO>();
					for(ItemPedido ip : items){
						articulos.add(ip.getArticulo());
						itemsPedidoDTO.add(new XMLItemPedidoDTO(ip.getArticulo().getRef(),ip.getCantidad()));
					}
					pedidosDTO.add(new XMLPedidoDTO(p.getTienda().getRef(), itemsPedidoDTO));
					p.setPendienteDeDistribucion(true);
				}
			}

			try {
				XMLSolDistDTO sd = new XMLSolDistDTO(solicitud.getRef(), pedidosDTO);
				XMLParser parser = new XMLParser();
				parser.generateXmlAndSave(sd);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	@Override
	public Hashtable <String, CentroDistribucion> generarSolicitudesDistribucionWS(){
		// HashTable Key Value, con el xml para cada centro y el objeto centro de distribucion correspondiente a cada uno.
		Hashtable <String, CentroDistribucion> solicitudesXMLyCentros = new Hashtable<String, CentroDistribucion>();

		Query q= em.createQuery("SELECT cd FROM CentroDistribucion cd");
		List<CentroDistribucion> centros= q.getResultList();

		for (CentroDistribucion cd : centros) {
			SolicitudDistribucion solicitud= new SolicitudDistribucion(null, cd);

			Query q1= em.createQuery("SELECT p FROM Pedido p WHERE p.pendienteDeDistribucion= ?1 and p.centroDistribucion= ?2").setParameter(1, false).setParameter(2, cd);
			List<Pedido> pedidos= (List<Pedido>)q1.getResultList();

			List<Articulo> articulos= new ArrayList<Articulo>();
			List<XMLPedidoDTO> pedidosDTO = new ArrayList<XMLPedidoDTO>();

			if (!pedidos.isEmpty() && pedidos.get(0)!=null){
				
				em.persist(solicitud);

				for(Pedido p : pedidos){
					if(p != null){	
						List<ItemPedido> items= p.getItemsPedidos();
						List<XMLItemPedidoDTO> itemsPedidoDTO= new ArrayList<XMLItemPedidoDTO>();
						for(ItemPedido ip : items){
							articulos.add(ip.getArticulo());
							itemsPedidoDTO.add(new XMLItemPedidoDTO(ip.getArticulo().getRef(),ip.getCantidad()));
						}

						pedidosDTO.add(new XMLPedidoDTO(p.getTienda().getRef(), itemsPedidoDTO));
						p.setPendienteDeDistribucion(true);
					}
				}

				//Final Results
				try {
					XMLSolDistDTO sd = new XMLSolDistDTO(solicitud.getRef(), pedidosDTO);
					XMLParser parser = new XMLParser();
					String xmlSoldis = parser.getXmlString(sd);

					//Agrego a la HashTable el xml correspondiente y el centro.
					solicitudesXMLyCentros.put(xmlSoldis, cd);
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
		}

		return solicitudesXMLyCentros;

	}
	
}
